package com.lagou.system.util;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.Data;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Date;

/**
 * @author Fxz
 * @version 1.0
 * @date 2021-10-04 21:27
 */
@Data
public class JwtUtil {

    /**
     * 有效期 一个月
     */
    public static final Long JWT_TTL = 1000L * 60 * 60 * 24 * 30;

    /**
     * 密钥明文
     */
    public static final String JWT_KEY = "Fxzzzz";

    /**
     * 生成令牌
     *
     * @param id       令牌id
     * @param subject  主题
     * @param ttlMills 有效期
     * @return
     */
    public static String createJwt(String id, String subject, Long ttlMills) {
        ttlMills = ttlMills == null ? JwtUtil.JWT_TTL : ttlMills;
        Date expDate = new Date(System.currentTimeMillis() + ttlMills);
        //获取密钥密文
        SecretKey secretKey = generalKey();
        return Jwts.builder().setId(id).setSubject(subject).setIssuer("admin").setIssuedAt(new Date()).setExpiration(expDate).signWith(SignatureAlgorithm.HS256, secretKey).compact();
    }

    /**
     * 生成密钥的密文
     *
     * @return
     */
    public static SecretKey generalKey() {
        byte[] encode = Base64.getEncoder().encode(JwtUtil.JWT_KEY.getBytes(StandardCharsets.UTF_8));
        return new SecretKeySpec(encode, 0, encode.length, "AES");
    }

    /**
     * 测试生成令牌
     *
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(createJwt("1", "fxz", null));
    }
}
